package net.sk.china.platform.service.user;

import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import net.sk.china.common.model.user.User;
import net.sk.china.platform.request.user.UserOperateIntegralMoneyRequest;
import net.sk.china.platform.request.user.UserSearchRequest;
import net.sk.china.platform.request.user.UserUpdateRequest;
import net.sk.china.platform.response.user.TopDetailResponse;
import net.sk.china.platform.response.user.UserResponse;
import net.sk.china.common.request.PageParamRequest;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * UserService 接口实现
 * +----------------------------------------------------------------------
 * // | Talk To [ 聊来改善地区金融服务环境，助力企业发展 ]
 * // +----------------------------------------------------------------------
 * // | Copyright (c) 2018-2024 聊来 All rights reserved.
 * // +----------------------------------------------------------------------
 * // | Licensed ( <a href="http://www.apache.org/licenses/LICENSE-2.0">apache</a> )
 * // +----------------------------------------------------------------------
 * // | @Author: 聊来 <18970881148@qq.com>
 * // +----------------------------------------------------------------------
 * // | DateTime: 2024/6/20 14:41
 * // +----------------------------------------------------------------------
 */
public interface UserService extends IService<User> {

    /**
     * 根据账号查询用户
     * @param account 账号
     * @return {@code User}
     */
    User getByAccount(String account);

    /**
     * 根据手机号查询用户
     * @param phone 用户手机号
     * @return {@code User}
     */
    User getByPhone(String phone);

    /**
     * 根据日期获取注册用户数量
     * @param date 日期
     * @return Integer
     */
    Long getRegisterNumByDate(String date);

    /**
     * 用户统计曲线图
     * @param date 查询日期
     * @return {@code Map<Object, Object>}
     */
    Map<Object, Object> getAddUserCountGroupDate(String date);


    /**
     * 清除User Group id
     * @param groupId 待清除的GroupId
     */
    void clearGroupByGroupId(String groupId);

    /**
     * 用户分页列表
     * @param request 查询参数
     * @param pageParamRequest 分页参数
     * @return {@code PageInfo<UserResponse>}
     */
    PageInfo<UserResponse> getList(UserSearchRequest request, PageParamRequest pageParamRequest);


    /**
     * 更新用户
     * @param userRequest 用户参数
     * @return {@code Boolean}
     */
    Boolean updateUser(UserUpdateRequest userRequest);

    /**
     * 后台修改用户手机号
     * @param id 用户uid
     * @param phone 手机号
     * @return {@code Boolean}
     */
    Boolean updateUserPhone(Integer id, String phone);

    /**
     * 获取用户详情
     * @param id 用户uid
     * @return {@code User}
     */
    User getInfoByUid(Integer id);

    /**
     * 根据参数类型查询会员对应的信息
     * @param userId Integer 会员id
     * @param type int 类型 0=消费记录，1=积分明细，2=签到记录，3=持有优惠券，4=余额变动
     * @param pageParamRequest PageParamRequest 分页
     * @return {@code Object}
     */
    Object getInfoByCondition(Integer userId, Integer type, PageParamRequest pageParamRequest);

    /**
     * 根据昵称匹配用户，返回id集合
     * @param nikeName 需要匹配得昵称
     * @return {@code List<Integer>}
     */
    List<Integer> findIdListLikeName(String nikeName);

    /**
     * 会员详情页Top数据
     * @param userId 用户uid
     * @return {@code TopDetailResponse}
     */
    TopDetailResponse getTopDetail(Integer userId);

    /**
     * 操作积分、余额
     * @param request 请求数据
     * @return {@code Boolean}
     */
    Boolean updateIntegralMoney(UserOperateIntegralMoneyRequest request);

    /**
     * 添加/扣减余额
     * @param uid 用户id
     * @param price 金额
     * @param oldMoney 历史金额
     * @param type 类型：add—添加，sub—扣减
     * @return {@code Boolean}
     */
    Boolean operationNowMoney(Integer uid, BigDecimal price, BigDecimal oldMoney, String type);

    /**
     * 添加、扣减积分
     * @param uid 用户id
     * @param integral 积分
     * @param oldIntegral 历史积分
     * @param type 类型：add—添加，sub—扣减
     * @return {@code Boolean}
     */
    Boolean operationIntegral(Integer uid, Integer integral, Integer oldIntegral, String type);

    /**
     * 会员分组
     * @param id String id
     * @param groupId Integer 分组Id
     * @return {@code Boolean}
     */
    Boolean group(String id, String groupId);

    /**
     * 会员标签
     * @param id         String id
     * @param tagId Integer 标签Id
     * @return {@code Boolean}
     */
    Boolean tag(String id, String tagId);

    /**
     * 根据用户id获取用户列表 map模式
     * @param uidList uidList
     * @return {@code HashMap<Integer, User>}
     */
    HashMap<Integer, User> getMapListInUid(List<Integer> uidList);
}